package com.ithiema.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ithiema.reggie.common.R;
import com.ithiema.reggie.entity.Category;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

/**
 * 通用控制器
 *
 * @author wangxiao
 * @since 2022/11/4 11:17
 */
@Slf4j
@RestController
@RequestMapping("/common")
public class CommonController {
    /*
    根据注解，拿到我们配置文件中的内容 ，文件上传后的保存路径 是yml配置文件中上传路径
     */
    @Value("${reggie.path}")
    private String basePath;

    /*
    前后端连通
    请求方式
    请求路径
    请求参数
    响应返回值
    /*
    文件上传
     */
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file) {
//        在文件上传的时候，是会把文件保存到一个临时目录中
        log.info("前后端联通");
//        获取文件名和后缀名
//        文件名
        String originalFilename = file.getOriginalFilename();
//        后缀名
//        拿到的是"."最后出现的位置
        int index = originalFilename.lastIndexOf(".");
//        文件后缀
        String substring = originalFilename.substring(index);
//        使用UUID重新生成新图片文件名
        String uuid = UUID.randomUUID().toString();
//        拼接一个新的文件名
        String newFileName = uuid + substring;
        /*
        创建图片保存的基本目录 new File的时候是不会在硬盘中真正的创建路径的，这里只是再内存中创建了File对象
        如果在new file的时候就创建了我们指定的路径或者是文件

         */
        File dir = new File(basePath);
//       路径是否不存在
//        如果已经创建了，那么就不需要再判断
        if (!dir.exists()){
//            /如果文件不存在。就来创建这个文件夹
            dir.mkdir();
        }
//        保存临时文件到图片目录下
        try {
            /*
            文件转移，file == > basePath路径下，并且文件是newFileName
             */
            file.transferTo(new File(basePath,newFileName));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
//        返回新图片文件名
        return R.success(newFileName);
    }
    /**
     * 文件下载，下载到你的浏览器
     */
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response){
        log.info("name == > {}",name);
        try {
//            1.定义输入流 通过输入流读取文件内容，根据输入流读取文件
            File file = new File(basePath,name);
//            拿到我们要用的文件
            FileInputStream fileInputStream = new FileInputStream(file);
//            2.通过response对象设置响应数据格式（image/jpeg）
            response.setContentType("image/jpeg");
//            3.通过response对象，获取到输出流
            ServletOutputStream outputStream = response.getOutputStream();
//            4.通过输入流读取文件数据，然后通过输出流写会浏览器 每次读取数据length的长度
            int length = 0;
//            1024 byte = 1kb,通常都会通过每次往浏览器发送1kb的方式写会到浏览器中
//            这样可以避免如果返回大数据量的话，浏览器出问题
            byte[] bytes = new byte[1024];
//            fileInputStream.read 读取文件时，如果反回的是－1，就代表文件读完了，读完了之后，跳出循环体即可
            while ((length = fileInputStream.read(bytes)) != -1){
//                写文件到浏览器中
                outputStream.write(bytes,0,length);
                outputStream.flush();
            }
//          关闭资源
            fileInputStream.close();
        }catch (IOException e){
            throw new RuntimeException(e);
        }
    }

}
